<?php
/**
 * Nweb Framework
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @category    source
 * @package     pl.nweb.framework.application.controller
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @license     http://www.gnu.org/licenses/lgpl-3.0.txt  GNU Lesser General Public
 * @version     3.0 $Id$
 * @link        http://code.google.com/p/nweb-framework/
 * @link        http://framework.nweb.pl
 */

namespace pl\nweb\framework\application\controller;

/**
 * Kontroler aplikacji żądania http
 *
 * @category    source
 * @package     pl.nweb.framework.application.controller
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @version     3.0 $Id$
 */
class Http extends \pl\nweb\framework\application\Controller
{
    /**
     * Obiekt widoku
     *
     * @var \pl\nweb\framework\View
     */
    private $_view = null;

    /**
     * Konfiguracja obiektów
     *
     * @return void
     */
    protected function _setup ()
    {
        $this->_view = new \pl\nweb\framework\View ();
    }

    /**
     * Definuje wartość widoku
     *
     * @param  string $name nazwa elementu
     * @param  string $value wartość elementu
     * @return void
     */
    public function  __set ($name, $value)
    {
        if(substr($name, 0, 1) != '_') {
            $this->getView()->assign($name, $value);
        }
    }

    /**
     * Generuje odpowiedź w formacie json
     *
     * @param mixed $data dane
     * @param null|integer $options opcje
     * @return void
     */
    public function json ($data, $options = null)
    {
        $this->getResponse()->setHeader('Content-Type', 'application/json', true);
        $this->getResponse()->setContents(json_encode($data, $options));
    }

    /**
     * Generuje odpowiedź w formacie json
     *
     * @param string $data dane
     * @param null|integer $options opcje
     * @return void
     */
    public function xml ($xml)
    {
        $this->getResponse()->setHeader('Content-Type', 'application/json', true);
    }

    /**
     * Wykonuje żądanie
     *
     * @param \pl\nweb\framework\Request\Http obiekt żądania http
     * @param \pl\nweb\framework\Response\Http obiekt odpowiedzi http
     * @return void
     * @throws \pl\nweb\framework\application\dispatcher\Exception
     */
    public function dispatch (\pl\nweb\framework\Request\Http $request, \pl\nweb\framework\Response\Http $response)
    {
        $response->clear();
        parent::dispatch($request, $response);
        if($request->isDispatched() && !$response->hasContents()) {
            // Konfiguracja obiektu widoku (skrypty, filtry, helpery)
            $response->setContents($this->getView()->render());
        }
    }

    /**
     * Zwraca obiekt żądania
     *
     * @return \pl\nweb\framework\View
     */
    protected function getView ()
    {
        return $this->_view;
    }
}